home *** CD-ROM | disk | FTP | other *** search
- Listing 6 -- wcstombs.c
-
- /* wcstombs function */
- #include <limits.h>
- #include <string.h>
- #include <stdlib.h>
-
- size_t (wcstombs)(char *s, const wchar_t *wcs, size_t n)
- { /* translate wide char string to multibyte string */
- char *sc;
- char state = {0};
- size_t i;
-
- for (sc = s; 0 < n; n -= i, ++wcs)
- { /* translate another wide character */
- if (MB_CUR_MAX <= n)
- { /* copy directly */
- if ((i = _Wctomb(sc, *wcs, &state)) <= 0)
- return (-1);
- }
- else
- { /* copy into local buffer */
- char buf[MB_LEN_MAX];
-
- if ((i = _Wctomb(buf, *wcs, &state)) <= 0)
- return (-1);
- else if (i <= n)
- memcpy(sc, buf, i);
- else
- { /* won't all fit */
- memcpy(sc, buf, n);
- return (sc - s + n);
- }
- }
- sc += i;
- if (sc[-1] == '\0')
- return (sc - s - 1);
- }
- return (sc - s);
- }
-
-